﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.IO;
using System.Diagnostics;
using System.Data;

namespace DigitalSolutionLibrary.Utilities
{
    public class Utility
    {
        private Utility()
        {
        }

        /// <summary>
        /// Create random string
        /// </summary>
        /// <param name="len">length of random string</param>
        /// <returns>random string</returns>
        public static string CreateRamdomString(int len)
        {
            string patern = "abcdefghijklmnopsqrtuvxyzABCDEFGHIJKLMNOPSQRTUVXYZ1234567890";
            string result = String.Empty;
            Random rd = new Random();
            for (int i = 1; i <= len; i++)
            {
                int _rd = rd.Next(0, patern.Length - 1);
                result += patern.Substring(_rd, 1);
            }
            return result;
        }

        /// <summary>
        /// Create random number string
        /// </summary>
        /// <param name="len">length of random string</param>
        /// <returns>random string</returns>
        public static string CreateRamdomNumberString(int len)
        {
            string patern = "1234567890";
            string result = String.Empty;
            Random rd = new Random();
            for (int i = 1; i <= len; i++)
            {
                int _rd = rd.Next(0, patern.Length - 1);
                result += patern.Substring(_rd, 1);
            }
            return result;
        }

        private static string ReadThreeNumber(string threeNumber)
        {
            if (int.Parse(threeNumber) == 0)
                return String.Empty;
            
            string rs = String.Empty;
            string[] chuSo;
            string[] chuCuoi;

            switch (threeNumber.Length)
            {
                case 1:
                    chuSo = new string[] { "Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu", "Bảy", "Tám", "Chín" };
                    rs =  chuSo[Convert.ToInt16(threeNumber)];
                    break;
                case 2:
                    
                    chuSo = new string[] { "", "Mười", "Hai", "Ba", "Bốn", "Năm", "Sáu", "Bảy", "Tám", "Chín" };
                    if (threeNumber[0].ToString() == "1")
                        chuCuoi = new string[] { "", "Một", "Hai", "Ba", "Bốn", "Lăm", "Sáu", "Bảy", "Tám", "Chín" };
                    else
                        chuCuoi = new string[] { "Mươi", "Mươi Mốt", "Mươi Hai", "Mươi Ba", "Mươi Bốn", "Mươi Lăm", "Mươi Sáu", "Mươi Bảy", "Mươi Tám", "Mươi Chín" };

                    rs = chuSo[int.Parse(threeNumber[0].ToString())];
                    rs += " " + chuCuoi[int.Parse(threeNumber[1].ToString())];
                    break;
                case 3:
                    string[] chuSoHangTram = new string[] { "Không Trăm", "Một Trăm", "Hai Trăm", "Ba Trăm", "Bốn Trăm", "Năm Trăm", "Sáu Trăm", "Bảy Trăm", "Tám Trăm", "Chín Trăm" };

                    if (threeNumber[1].ToString() == "0" && threeNumber[2].ToString() == "0")
                    {
                        rs = chuSoHangTram[int.Parse(threeNumber[0].ToString())];
                        break;
                    }
                    
                    string[] chuSoHangChuc = new string[] { "Lẻ", "Mười", "Hai Mươi", "Ba Mươi", "Bốn Mươi", "Năm Mươi", "Sáu Mươi", "Bảy Mươi", "Tám Mươi", "Chín Mươi" };

                    if (threeNumber[1].ToString() == "0")
                        chuCuoi = new string[] { "", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu", "Bảy", "Tám", "Chín" };
                    else if (threeNumber[1].ToString() == "1")
                        chuCuoi = new string[] { "", "Một", "Hai", "Ba", "Bốn", "Lăm", "Sáu", "Bảy", "Tám", "Chín" };
                    else
                        chuCuoi = new string[] { "", "Mốt", "Hai", "Ba", "Bốn", "Lăm", "Sáu", "Bảy", "Tám", "Chín" };

                    rs = chuSoHangTram[int.Parse(threeNumber[0].ToString())];
                    rs += " " + chuSoHangChuc[int.Parse(threeNumber[1].ToString())];
                    rs += " " + chuCuoi[int.Parse(threeNumber[2].ToString())];

                    break;
            }
            return rs.Trim();
        }

        /// <summary>
        /// Đọc số tiền thành chữ
        /// </summary>
        /// <param name="money"></param>
        /// <returns>Số tiền bằng chữ</returns>
        public static string ReadMoney(long money)
        {
            if (money > 999999999999)
                return "[Không thể đọc số tiền quá lớn]";
            if(money < 0)
                return "[Số tiền không đúng]";
            if (money == 0)
                return "Không Đồng";

            string result = String.Empty;
            string strMoney = money.ToString();
            strMoney = strMoney.TrimStart('0');

            if (strMoney.Length > 3)
            {
                List<string> sliptMoney = new List<string>();
                while (strMoney.Length > 3)
                {
                    sliptMoney.Add(strMoney.Substring(strMoney.Length - 3));
                    strMoney = strMoney.Remove(strMoney.Length - 3);
                }
                sliptMoney.Add(strMoney);

                string[] donVi = new string[] { "", "Ngàn", "Triệu", "Tỷ" };
                for (int i = sliptMoney.Count - 1; i >= 0; i--)
                {
                    if (int.Parse(sliptMoney[i]) > 0)
                        result += " " + ReadThreeNumber(sliptMoney[i]) + " " + donVi[i];
                }
            }
            else
                result = ReadThreeNumber(strMoney);
            
            return result.Trim()+" Đồng";
        }

        /// <summary>
        /// Convert image to byte[]
        /// </summary>
        /// <param name="image">Image to convert</param>
        /// <returns>byte[] of image</returns>
        public static byte[] ImageToByte(Image image)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
            return null;
        }

        /// <summary>
        /// Convert byte[] to image
        /// </summary>
        /// <param name="data">image data</param>
        /// <returns>Image</returns>
        public static Image ByteToImage(byte[] data)
        {
            try
            {
                MemoryStream ms = new MemoryStream(data);
                return Image.FromStream(ms);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
            return null;
        }

        public static string DataTableToXml(DataTable table)
        {
            if (table.TableName == String.Empty)
                table.TableName = "Node";
            
            string result;
            using (StringWriter sw = new StringWriter())
            {
                table.WriteXml(sw);
                result = sw.ToString();
            }

            return result.Replace("DocumentElement", "Root");
        }
    }
}
